function _ctClamp(value, min, max) { return Math.min(max, Math.max(min, value)); } function _ctRgbToHex(r, g, b) { var toHex = function(value) { var h = value.toString(16).toUpperCase(); return h.length === 1 ? '0' + h : h; }; return '#' + toHex(r) + toHex(g) + toHex(b); } function _ctRgbToHsl(r, g, b) { var rn = r / 255, gn = g / 255, bn = b / 255; var max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn); var h = 0, s = 0, l = (max + min) / 2; if (max !== min) { var d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case rn: h = (gn - bn) / d + (gn < bn ? 6 : 0); break; case gn: h = (bn - rn) / d + 2; break; default: h = (rn - gn) / d + 4; break; } h = h / 6; } return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) }; } function _ctHueToRgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; } function _ctHslToRgb(h, s, l) { var hn = ((h % 360) + 360) % 360 / 360; var sn = _ctClamp(s, 0, 100) / 100; var ln = _ctClamp(l, 0, 100) / 100; var r, g, b; if (sn === 0) { r = g = b = ln; } else { var q = ln < 0.5 ? ln * (1 + sn) : ln + sn - ln * sn; var p = 2 * ln - q; r = _ctHueToRgb(p, q, hn + 1 / 3); g = _ctHueToRgb(p, q, hn); b = _ctHueToRgb(p, q, hn - 1 / 3); } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) }; } function _ctParseColor(input) { var value = (input || '').trim(); if (!value) return null; var hex = value.match(/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/); if (hex) { var h = hex[1]; if (h.length === 3) h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2]; return { r: parseInt(h.substring(0, 2), 16), g: parseInt(h.substring(2, 4), 16), b: parseInt(h.substring(4, 6), 16) }; } var rgb = value.match(/^rgb\(\s*([+-]?\d{1,3})\s*,\s*([+-]?\d{1,3})\s*,\s*([+-]?\d{1,3})\s*\)$/i); if (rgb) { var rr = parseInt(rgb[1], 10), gg = parseInt(rgb[2], 10), bb = parseInt(rgb[3], 10); if (rr < 0 || rr > 255 || gg < 0 || gg > 255 || bb < 0 || bb > 255) return null; return { r: rr, g: gg, b: bb }; } var hsl = value.match(/^hsl\(\s*([+-]?\d*\.?\d+)(?:deg)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*\)$/i); if (hsl) { var hh = parseFloat(hsl[1]); var ss = parseFloat(hsl[2]); var ll = parseFloat(hsl[3]); if (isNaN(hh) || isNaN(ss) || isNaN(ll) || ss < 0 || ss > 100 || ll < 0 || ll > 100) return null; return _ctHslToRgb(hh, ss, ll); } return null; } function convert(input) { if (!input || !input.trim()) return ''; var rgb = _ctParseColor(input); if (!rgb) { return 'Invalid color format. Use HEX (#ff5733), RGB (rgb(255,87,51)), or HSL (hsl(11,100%,60%)).'; } var hex = _ctRgbToHex(rgb.r, rgb.g, rgb.b); var hsl = _ctRgbToHsl(rgb.r, rgb.g, rgb.b); return 'HEX: ' + hex + '\nRGB: rgb(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ')' + '\nHSL: hsl(' + hsl.h + ', ' + hsl.s + '%, ' + hsl.l + '%)'; } var _loadedScripts = {}; function loadScriptPromise(url) { if (_loadedScripts[url]) return _loadedScripts[url]; _loadedScripts[url] = new Promise(function (resolve, reject) { var s = document.createElement('script'); s.src = url; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); return _loadedScripts[url]; } function replaceAll(find, replace, str) { return str.replace(new RegExp(find, 'g'), replace); } function beautify(str) { var result = ''; var length = str.length; var i = 0; var braceCountLeft = 0; var braceCountRight = 0; var withinQuotes = false; while (i < length) { var c = str[i]; if (c == '"' && (i == 0 || c[i - 1] != '\\')) { // non-escaped quotes withinQuotes = !withinQuotes; } if (!withinQuotes && (c == '}' || c == '{' || c == ',')) { console.log('Start####' + result); // look back and remove carriage returns and whitespace that are already there var resultIndex = result.length - 1; while (resultIndex >= 0 && (result[resultIndex] == ' ' || result[resultIndex] == '\r' || result[resultIndex] == '\n' || result[resultIndex] == '\t')) { resultIndex = resultIndex - 1; result = result.substr(0, resultIndex + 1); console.log('char ' + result[resultIndex] + '-----' + result + 'zzz ' + result.length + ' ' + resultIndex); } if (c == '{') { braceCountLeft++; result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } else if (c == '}') { braceCountRight++; // precede with carriage return result += '\r' + GetTabs(braceCountLeft - braceCountRight) + c; } else if (c == ',') { result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } var nextChar = ''; // advance through whitespace and remove carriage returns that are already there while (i < length && (str[i + 1] == ' ' || str[i + 1] == '\r' || str[i + 1] == '\n' || str[i + 1] == '\t')) { i++; } } else { result += str[i]; } i++; } return result; } function GetTabs(count) { var result = ''; for (var i = 0; i < count; i++) { result += ' '; } return result; }